package com.sxt.utils;

import java.util.BitSet;

/**
 * 布隆算法过滤器
 * @author LU
 *
 */
public class BloomFiler {
	// 设置集合的大小
	private static int BIT_LENGTH = (2<<31-1)-1;
	
	// 实例化bitset集合
	private static BitSet bitSet = new BitSet(BIT_LENGTH);
	
	// 定义函数的数量
	private static int HASH_NUM = 4;
	
	// 实例化自定义hash函数
	private static HashFun [] hashFuns = new HashFun[HASH_NUM];
	
	// hash函数的种子值(素数)
	private static int [] seeds = new int[] {17,23,29,31};
	
	// 初始化hash函数
	static {
		for (int i = 0; i < HASH_NUM; i++) {
			hashFuns[i] = new HashFun(seeds[i]);
		}
	}
	
	/**
	 * 往bitset集合里面存储值
	 * @param value
	 */
	public static void save2BitSet(String value) {
		if(null==value) throw new RuntimeException("value的值不能为空");
		for (HashFun hashFun : hashFuns) {
			// 计算value的hash值
			int hashCode = hashFun.hash(value);
			// 与运算得到hashCode值映射在bitset集合上面的位置
			int pos = hashCode & (BIT_LENGTH-1);
			// 将该点设置为1
			bitSet.set(pos, true);
			System.out.println(value+"在集合中的位置是："+pos);
		}
	}
	
	/**
	 * 判断bitset集合里面是否存在查询的值
	 * @param value
	 * @return
	 */
	public static boolean existInBitSet(String value) {
		if (value == null)
			throw new RuntimeException("value不能为null");
		for (HashFun hashFun : hashFuns) {
			int hashCode = hashFun.hash(value);
			int pos = hashCode & (BIT_LENGTH - 1);
			if (!bitSet.get(pos)) {
				System.out.println("bitset里面不存在: "+value+"的值");
				return false;
			}
			System.out.println("bitset里面存在: "+value+"的值");
		}
		return true;
	}
	
	public static void main(String[] args) {
		save2BitSet("lsx");
		existInBitSet("lsx");
	}
}
